package main

import (
	"log"
	"time"
)

// nil channel 的特性：对 nil channel 进行读写会发生堵塞
// 示例2：预期输出 5 和 7 后程序退出 （对示例1的改进）

func main() {
	ch1, ch2 := make(chan int), make(chan int)

	go func() {
		time.Sleep(5 * time.Second)
		ch1 <- 5
		close(ch1)
	}()

	go func() {
		time.Sleep(7 * time.Second)
		ch2 <- 7
		close(ch2)
	}()

	for {
		// 在检查到 ch1、ch2 被关闭后，显式将它们重置为 nil
		// 于是 case 分支被阻塞，将再也不会被 select 选中执行
		select {
		case v1, ok := <-ch1:
			if !ok {
				ch1 = nil
			} else {
				log.Println(v1)
			}
		case v2, ok := <-ch2:
			if !ok {
				ch2 = nil
			} else {
				log.Println(v2)
			}
		}

		if ch1 == nil && ch2 == nil {
			break
		}
	}

	log.Println("program end")

}
